package org.javahispano.javacup.tacticas_aceptadas.darkkor.tactica;

import org.javahispano.javacup.modelo.*;

import java.util.ArrayList;
import java.util.List;

public class TacticaDarkkor implements Tactica {

    Posicion alineacion1[]=new Posicion[]{
        new Posicion(0,-50.41044776119403),
        new Posicion(-26.867132867132867,-26.368778280542987),
        new Posicion(-8.321678321678322,-26.131221719457013),
        new Posicion(8.321678321678322,-25.656108597285066),
        new Posicion(29.72027972027972,-25.893665158371043),
        new Posicion(-11.65034965034965,-12.828054298642533),
        new Posicion(23.538461538461537,-1.900452488687783),
        new Posicion(13.314685314685315,-13.540723981900454),
        new Posicion(0.0,-0.23755656108597287),
        new Posicion(3.090909090909091,-1.4253393665158371),
        new Posicion(-25.916083916083913,-1.900452488687783)
    };

    Posicion alineacion2[]=new Posicion[]{
            new Posicion(0,-50.41044776119403),
            new Posicion(-24.965034965034967,-32.07013574660634),
            new Posicion(-10.461538461538462,-32.30769230769231),
            new Posicion(7.846153846153847,-32.07013574660634),
            new Posicion(24.251748251748253,-31.83257918552036),
            new Posicion(-0.951048951048951,-20.90497737556561),
            new Posicion(21.3986013986014,-14.490950226244346),
            new Posicion(0.0,-10.690045248868778),
            new Posicion(10.223776223776223,-10.927601809954751),
            new Posicion(-9.272727272727272,-10.690045248868778),
            new Posicion(-22.58741258741259,-14.490950226244346)
    };

    Posicion alineacion3[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-24.965034965034967,-32.07013574660634),
            new Posicion(-10.461538461538462,-32.30769230769231),
            new Posicion(7.846153846153847,-32.07013574660634),
            new Posicion(24.251748251748253,-31.83257918552036),
            new Posicion(-0.7132867132867133,-27.08144796380091),
            new Posicion(27.58041958041958,-16.866515837104075),
            new Posicion(9.986013986013985,-16.628959276018097),
            new Posicion(0.0,7.364253393665159),
            new Posicion(-8.083916083916083,-17.57918552036199),
            new Posicion(-26.153846153846157,-16.866515837104075)
        };

        Posicion alineacion4[]=new Posicion[]{
            new Posicion(0.23776223776223776,-36.82126696832579),
            new Posicion(-24.48951048951049,-16.391402714932127),
            new Posicion(0.0,-11.877828054298643),
            new Posicion(-0.23776223776223776,-22.092760180995477),
            new Posicion(20.923076923076923,-15.441176470588236),
            new Posicion(-15.454545454545453,-8.552036199095022),
            new Posicion(21.16083916083916,15.203619909502263),
            new Posicion(16.167832167832167,-6.414027149321266),
            new Posicion(-0.7132867132867133,15.203619909502263),
            new Posicion(0.0,3.800904977375566),
            new Posicion(-21.636363636363637,14.728506787330318)
        };

        Posicion alineacion5[]=new Posicion[]{
            new Posicion(-0.4755244755244755,-27.794117647058822),
            new Posicion(-31.146853146853147,9.264705882352942),
            new Posicion(-0.4755244755244755,9.502262443438914),
            new Posicion(-0.4755244755244755,-11.402714932126697),
            new Posicion(30.433566433566433,8.076923076923077),
            new Posicion(-16.88111888111888,18.766968325791854),
            new Posicion(20.20979020979021,34.68325791855204),
            new Posicion(14.97902097902098,17.816742081447966),
            new Posicion(-0.23776223776223776,40.147058823529406),
            new Posicion(0.23776223776223776,27.08144796380091),
            new Posicion(-19.97202797202797,35.8710407239819)
        };
        
        
    TacticaDarkkorDetalle detalle = new TacticaDarkkorDetalle();
    ArrayList<Comando> comandos = new ArrayList<Comando>();
    Posicion balon = Constantes.centroCampoJuego;
    
    
    
    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    return alineacion1;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    return alineacion2;
    }

    public TacticaDetalle getDetalle() {
        return detalle;
    }

    public List<Comando> ejecutar(SituacionPartido sp) {
       comandos.clear();
       Posicion[] alineacio = getAlineacio(sp.balon());
       for(int i = 0 ; i<11; i++){
    	   comandos.add(new ComandoIrA(i,alineacio[i]));
       }
       int cercanos[] = sp.balon().indicesMasCercanos(sp.misJugadores(),0);
       Posicion lateral;
	   if(sp.balon().getX() < 0)	lateral = new Posicion(-30,-30);
	   else 						lateral = new Posicion(30,-30);
	   
       if(sp.balon().distancia(sp.misJugadores()[cercanos[0]])<Constantes.DISTANCIA_CONTROL_BALON){
		   
		   if(sp.balon().distancia(Constantes.centroArcoSup)<20){
			   Posicion xut; 
			   double altura;
			   double pot;
			   
			   double distanciaPorteria = Constantes.centroArcoSup.getY() - sp.balon().getY();
			   double distanciaPortero = sp.rivales()[0].getY() - sp.balon().getY();
			   double angulo1 = sp.balon().angulo(Constantes.posteDerArcoSup);
			   double angulo2 = sp.balon().angulo(Constantes.posteIzqArcoSup);
			   double beta = sp.balon().angulo(sp.rivales()[0]);
			   double angulo;
			   
			   if(distanciaPorteria - distanciaPortero > 5){
				   if (distanciaPorteria > 10){
					   pot = 0.75 + distanciaPorteria/100;
					   altura = 50;
					   xut = Constantes.centroArcoSup;
				   }else{
					   pot = 0.6;
					   altura = 60;
					   xut = Constantes.centroArcoSup;				   
				   }
			   }else{
				   if(angulo1 <= beta && beta <= angulo2){
					   if(angulo1-beta < beta-angulo2)
						   angulo = (beta + angulo2)/2;
					   else
						   angulo = (beta + angulo1)/2;
					   
				   }else{
					   angulo = sp.balon().angulo(Constantes.centroArcoSup);
				   }
				   xut = sp.balon().moverAngulo(angulo, sp.balon().distancia(Constantes.centroArcoSup));
  
			   }

			   comandos.add(new ComandoGolpearBalon(cercanos[0],xut,1,0));
		   }else{
			   
			   int rivales;
			   int rivalesAnt = 11;
			   int pasarA = -1;
			   for(int i = 10; i>0; i--){
				   rivales = 0;
				   double distanciaBalon = sp.balon().distancia(sp.misJugadores()[cercanos[i]]);
				   double y = sp.misJugadores()[cercanos[i]].getY();
				   if(distanciaBalon < 50 && distanciaBalon>10 && y > sp.balon().getY()){
					   Posicion jugador = sp.misJugadores()[cercanos[i]];
					   int rivalesCerca[] = jugador.indicesMasCercanos(sp.rivales());
					   for(int j = 0; j<11; j++){
						   double distanciaRival = jugador.distancia(sp.rivales()[rivalesCerca[j]]);
						   if(distanciaRival<5)
							   rivales++;
						   else
							   j=11;
						   
						   if(rivales < rivalesAnt){
							   rivalesAnt = rivales;
							   pasarA = cercanos[i];
						   }
					   }
				   }
			   }
			   double pot = 1;
			   double angulo = Constantes.ANGULO_VERTICAL_MAX;
			   
			   Posicion destino;

			   destino = Constantes.penalSup;  
			   angulo = Constantes.ANGULO_VERTICAL_MAX;
			   pot = 1;

			   comandos.add(new ComandoGolpearBalon(cercanos[0],destino,pot,angulo));

		}
	   }else{
		   Posicion balon2 = sp.balon().moverAngulo(balon.angulo(sp.balon()),2* balon.distancia(sp.balon()));
		   int rivales[] = sp.balon().indicesMasCercanos(sp.rivales());
		   comandos.add(new ComandoIrA(cercanos[0],sp.balon()));
		   comandos.add(new ComandoIrA(cercanos[1],balon2));

		   for(int i = 6; i>1; i--){
			   int cercaRival = sp.rivales()[rivales[i]].indiceMasCercano(sp.misJugadores(), cercanos[0],0, cercanos[1]);
			   double angulo = sp.rivales()[rivales[i]].angulo(sp.balon());
			   comandos.add(new ComandoIrA(cercaRival,sp.rivales()[rivales[i]].moverAngulo(angulo, 2)));
		   }
	   }
   
       if(sp.balon().distancia(Constantes.centroArcoInf) < 30 && sp.balon().distancia(Constantes.centroArcoInf) < balon.distancia(Constantes.centroArcoInf) ){
    	   double angulo = balon.angulo(sp.balon());
    	   double angulo1 = balon.angulo(Constantes.posteDerArcoInf);
    	   double angulo2 = balon.angulo(Constantes.posteIzqArcoInf);
    	   double beta = balon.angulo(sp.misJugadores()[0]);
    	   
    	   if(angulo < angulo1 && angulo > angulo2){
    		   double anguloPortero;
    		   if(angulo > -Math.PI/2){
    			   if(beta < angulo)
    				   anguloPortero = Math.PI/2 + angulo;
    			   else
    				   anguloPortero = angulo - Math.PI/2;
    		   }else{
    			  if(beta < angulo)
    				  anguloPortero = angulo +Math.PI/2;
    			  else
    				  anguloPortero = 3*Math.PI/2 + angulo;
    		   }
    		   Posicion portero = Posicion.Interseccion(balon, sp.balon(), sp.misJugadores()[0], 
    				   			sp.misJugadores()[0].moverAngulo(anguloPortero, 1));
    		   comandos.add(new ComandoIrA(0,portero.setDentroCampoJuego()));
    		   comandos.add(new ComandoGolpearBalon(0,lateral,1,Constantes.ANGULO_VERTICAL_MAX));
    		} 
    	   
    	   
       }else if(sp.balon().distancia(sp.misJugadores()[0])<3){
			comandos.add(new ComandoIrA(0,sp.balon()));
			comandos.add(new ComandoGolpearBalon(0,lateral,1,Constantes.ANGULO_VERTICAL_MAX));
       }
       balon = sp.balon();
       return comandos;
       
    }
    
    private Posicion[] getAlineacio(Posicion pilota){
    	if(pilota.getY()<-15)
    		return alineacion3;
    	else if(pilota.getY() > 15)
    		return alineacion5;
    	else
    		return alineacion4;
    }
    
	
}
